home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / source / snip9503 / lld_blob.c < prev    next >
C/C++ Source or Header  |  1995-03-14  |  3KB  |  132 lines

  1. /* =======================================================================
  2.     LLD_BLOB.c      Generic Doubly Linked Lists for Binary Large OBjects.
  3.                     Linked Lists for variable size data-items.
  4.                     This is a 'front end' for the generic LLD module.
  5.  
  6.                     v1.00  94-08-11
  7.  
  8.  _____              This version is Public Domain.
  9.  /_|__|             A.Reitsma, Delft, The Netherlands.
  10. /  | \  --------------------------------------------------------------- */
  11.  
  12. #include <stdlib.h>         /* for malloc()                             */
  13. #include "lld.h"            /* the generic LLD functions ...            */
  14. #include "lld_blob.h"       /* also includes portable.h if necessary    */
  15.  
  16. struct BlobDesc
  17. {
  18.     void * data ;           /* 'data' can be obtained by LLDnodePtr() ! */
  19.     unsigned size ;
  20. };
  21.  
  22. #define ERR_MEMORY          -1
  23.  
  24. /* ---- LL blob system mangement -------------------------------------- */
  25.  
  26. int LLDblobCreate( void )
  27. {
  28.     return LLDcreate( sizeof( struct BlobDesc ));
  29. }
  30.  
  31. /* ---- LL blob node mangement ---------------------------------------- */
  32.  
  33. int LLDblobInsert( int List, void * Source, unsigned Size )
  34. {                                       /* insert _BEFORE_ current node */
  35.     struct BlobDesc Blob ;
  36.  
  37.     Blob.size = Size ;
  38.     Blob.data = malloc( Size );
  39.  
  40.     if( NULL == Blob.data )
  41.     {
  42.         return ERR_MEMORY ;
  43.     }
  44.  
  45.     memcpy( Blob.data, Source, Size );
  46.     LLDnodeInsertFrom( List, & Blob );
  47.  
  48.     return LIST_NO_PROBLEMS ;
  49. }
  50.  
  51. int LLDblobAdd( int List, void * Source, unsigned Size )
  52. {                                        /* insert _AFTER_ current node */
  53.     struct BlobDesc Blob ;
  54.  
  55.     Blob.size = Size ;
  56.     Blob.data = malloc( Size );
  57.  
  58.     if( NULL == Blob.data )
  59.     {
  60.         return ERR_MEMORY ;
  61.     }
  62.  
  63.     memcpy( Blob.data, Source, Size );
  64.     LLDnodeAddFrom( List, & Blob );
  65.  
  66.     return LIST_NO_PROBLEMS ;
  67. }
  68.  
  69. int LLDblobPrepend( int List, void * Source, unsigned Size )
  70. {                                               /* insert as first node */
  71.     struct BlobDesc Blob ;
  72.  
  73.     Blob.size = Size ;
  74.     Blob.data = malloc( Size );
  75.  
  76.     if( NULL == Blob.data )
  77.     {
  78.         return ERR_MEMORY ;
  79.     }
  80.  
  81.     memcpy( Blob.data, Source, Size );
  82.     LLDnodePrependFrom( List, & Blob );
  83.  
  84.     return LIST_NO_PROBLEMS ;
  85. }
  86.  
  87. int LLDblobAppend( int List, void * Source, unsigned Size )
  88. {                                                /* insert as last node */
  89.     struct BlobDesc Blob ;
  90.  
  91.     Blob.size = Size ;
  92.     Blob.data = malloc( Size );
  93.  
  94.     if( NULL == Blob.data )
  95.     {
  96.         return ERR_MEMORY ;
  97.     }
  98.  
  99.     memcpy( Blob.data, Source, Size );
  100.     LLDnodeAppendFrom( List, & Blob );
  101.  
  102.     return LIST_NO_PROBLEMS ;
  103. }
  104.  
  105. void LLDblobDelete( int List )
  106. {
  107.     struct BlobDesc Blob ;
  108.  
  109.     LLDnodeDataTo( List, & Blob );
  110.     free( Blob.data );
  111.  
  112.     LLDnodeDelete( List );
  113.  
  114.     return ;
  115. }
  116.  
  117. /* ---- stored data management ---------------------------------------- */
  118.  
  119. unsigned LLDblobData( int List, void * Destination )
  120. {
  121.     struct BlobDesc Blob ;
  122.  
  123.     LLDnodeDataTo( List, & Blob );
  124.  
  125.     if( NULL != Destination )
  126.         memcpy( Destination, Blob.data, Blob.size );
  127.  
  128.     return Blob.size ;       /* size needed for blob */
  129. }
  130.  
  131. /* ==== LLD_BLOB.c  end =============================================== */
  132.